package model

import (
	"errors"
	"gorm.io/gorm"
	"time"
)

type DataLogin struct {
	ID        int64  `json:"id" gorm:"id"`
	FtpInfoId int64  `json:"ftp_info_id" gorm:"ftp_info_id"` //ftp_info_id
	Date      string `json:"date" gorm:"date"`               // 日期
	Time      string `json:"time" gorm:"time"`               // 时间
	LogTime   int64  `json:"log_time" gorm:"log_time"`       // 日志时间戳
	SteamId   string `json:"steam_id" gorm:"steam_id"`       // steam_id
	GameId    int64  `json:"game_id" gorm:"game_id"`         // 游戏id
	GameName  string `json:"game_name" gorm:"game_name"`     // 游戏名称
	LoginIp   string `json:"login_ip" gorm:"login_ip"`       // 登录ip
	LoginType string `json:"login_type" gorm:"login_type"`   // 登录类型
	Location  string `json:"location" gorm:"location"`       // 登录坐标
	UpdatedAt int64  `json:"updated_at" gorm:"updated_at"`   // 修改时间
	CreatedAt int64  `json:"created_at" gorm:"created_at"`   // 添加时间
	RegTime   int64  `json:"RegTime" gorm:"-"`               //用户注册记录时间用
}

func (DataLogin) TableName() string {
	return "sm_data_login"
}

func (u DataLogin) BeforeUpdate(tx *gorm.DB) (err error) {
	now := time.Now()
	unixTime := now.Unix()
	u.UpdatedAt = unixTime
	u.CreatedAt = unixTime
	return nil
}

type DataLoginM struct {
	DB *gorm.DB
}

func NewDataLoginM() *DataLoginM {
	return &DataLoginM{
		GetDB(),
	}
}

func (c *DataLoginM) InsertLoginData(DataLoginArr []DataLogin) bool {

	//fmt.Println("存入数据", len(DataChatArr))
	result := c.DB.Omit("id").CreateInBatches(DataLoginArr, 1000)

	if result.Error != nil {
		panic(result.Error)
	}
	return true
}

// 获取在线用户列表
func (p *DataLoginM) GetLoginList(ftpInfoId int64, loginTime int64) []map[string]interface{} {
	//var data []DataLogin
	//子查询  分组 steamid  去重 然或查询 id 最小的 代表 最先出现的  登录数据     然后关联id  查询数据
	var data []map[string]interface{}
	query := p.DB.Model(DataLogin{}).Select("steam_id, min(id) as id,max(log_time) as max_logtime, min(log_time) as min_logtime").Where("ftp_info_id = ? and log_time > ? and login_type = ?", ftpInfoId, loginTime, "logged in at").Group("steam_id")

	result := p.DB.Model(DataLogin{}).Joins("join (?) q on sm_data_login.id = q.id", query).Select("sm_data_login.*", " q.max_logtime", " q.min_logtime").
		Scan(&data)
	if result.Error != nil {
		if errors.Is(result.Error, gorm.ErrRecordNotFound) {
			// 没有找到记录
			return data
		} else {
			panic(result.Error)
			// 真正的执行错误

		}
	}
	//fmt.Print("条数", result.RowsAffected)
	//fmt.Print("info", data)
	return data
}

//用户数据创建时间   登录数据创建时间   不行      日志索引

// 获取离线用户列表
func (p *DataLoginM) GetLoginOutList(ftpInfoId int64, loginTime int64) []map[string]interface{} {
	//var data []DataLogin
	//子查询  分组 steamid  去重 然或查询 id 最小的 代表 最先出现的  登录数据     然后关联id  查询数据
	var data []map[string]interface{}
	query := p.DB.Model(DataLogin{}).Select("steam_id, min(id) as id,max(log_time) as max_logtime").Where("ftp_info_id = ? and log_time > ? and login_type = ?", ftpInfoId, loginTime, "logged out at").Group("steam_id")

	result := p.DB.Model(DataLogin{}).Joins("join (?) q on sm_data_login.id = q.id", query).Select("sm_data_login.*", " q.max_logtime").
		Scan(&data)
	if result.Error != nil {
		if errors.Is(result.Error, gorm.ErrRecordNotFound) {
			// 没有找到记录
			return data
		} else {
			panic(result.Error)
			// 真正的执行错误

		}
	}
	//fmt.Print("条数", result.RowsAffected)
	//fmt.Print("info", data)
	return data
}
